package com.ingenieria.industrial.controller;

import com.ingenieria.industrial.dto.Proceso;
import com.ingenieria.industrial.service.implementacion.ProcesoService;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ProcesoController extends BaseController {

    @RequestMapping(params = "action=nuevo")
    public ModelAndView mostrarProcesos(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        if (sesion.getAttribute("cod_usu") != null) {
            Proceso registro = new Proceso();
            ModelAndView mav = new ModelAndView("main.proceso.nuevo");
            mav.addObject("registro", registro);
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=guardar")
    public ModelAndView guardarProcesos(@ModelAttribute Proceso registro, HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        ProcesoService service = new ProcesoService();
        String msg = "";
        int result = 1;
        try {
            if (sesion.getAttribute("cod_usu") != null) {
                ModelAndView mav = new ModelAndView("mensaje");
                mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
                mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
                mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
                result = service.insert(registro);
                if (result > 0) {
                    String ruta = request.getSession().getServletContext().getRealPath("/");
                    msg = "Se registró " + result + " registro(s) ";
                    mav.addObject("msg", msg);
                }
                return mav;
            } else {
                ModelAndView mav = new ModelAndView("index");
                return mav;
            }
        } catch (Exception e) {
            msg = e.getMessage();
            ModelAndView mav = new ModelAndView("mensaje");
            mav.addObject("cod_usu", sesion.getAttribute("cod_usu"));
            mav.addObject("cod_rol", sesion.getAttribute("cod_rol"));
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            if (msg == null || "".equals(msg)) {
                mav.addObject("msg", "No se pudo realizar la operación.");
            } else {
                mav.addObject("msg", msg);
            }
            return mav;
        }
    }

    @RequestMapping(params = "action=get")
    public ModelAndView getProcesos(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        if (sesion.getAttribute("cod_usu") != null) {
            String id = request.getParameter("id");
            ProcesoService service = new ProcesoService();
            Proceso registro = null;
            try {
                registro = service.getById(id);
                String ruta = request.getSession().getServletContext().getRealPath("/");
                grabarFicheroALocal(registro, ruta);
                grabarFicheroALocalFor(registro, ruta);
            } catch (Exception ex) {
                System.out.println("error: " + ex.getMessage());
            }
            ModelAndView mav = new ModelAndView("main.proceso.modificar");
            mav.addObject("registro", registro);
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=modificar")
    public ModelAndView modificarProcesos(@ModelAttribute Proceso registro, HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        long tamaño = registro.getFileData().getSize();
        long tamañoFor = registro.getFileDataFor().getSize();
        if (tamaño == 0) {
            registro.setFileData(null);
        }
        if (tamañoFor == 0) {
            registro.setFileDataFor(null);
        }
        if (sesion.getAttribute("cod_usu") != null) {
            ProcesoService service = new ProcesoService();
            String msg = "";
            int result = -1;
            try {
                result = service.update(registro);
                if (result > 0) {
                    msg = "Se actualizó " + result + " registro(s) ";
                }

            } catch (Exception ex) {
                msg = ex.getMessage();
            }
            ModelAndView mav = new ModelAndView("mensaje");
            if (msg == null || "".equals(msg)) {
                mav.addObject("msg", "No se pudo realizar la operación.");
            } else {
                mav.addObject("msg", msg);
            }
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=lista")
    public ModelAndView listaProcesos(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        if (sesion.getAttribute("cod_usu") != null) {
            ModelAndView mav = new ModelAndView("main.proceso.lista");
            ProcesoService service = new ProcesoService();
            List lista = null;
            try {
                lista = service.getAll();
            } catch (Exception ex) {
                Logger.getLogger(ProcesoController.class.getName()).log(Level.SEVERE, null, ex);
            }
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            mav.addObject("lista", lista);
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }
    }

    @RequestMapping(params = "action=front")
    public ModelAndView listaFrontProcesos(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        String tipo = request.getParameter("tipo");
        ProcesoService service = new ProcesoService();
        if (sesion.getAttribute("cod_usu") != null) {
            List lista = null;
            ModelAndView mav = new ModelAndView("main.proceso.lista.front");
            try {
                lista = service.getListxTipo(tipo);
            } catch (Exception ex) {
                Logger.getLogger(ProcesoController.class.getName()).log(Level.SEVERE, null, ex);
            }
            if (tipo.equals("A")) {
                mav.addObject("wtitulo", "Procedimientos Académicos");
            } else if (tipo.equals("N")) {
                mav.addObject("wtitulo", "Normas");
            } else if (tipo.equals("P")) {
                mav.addObject("wtitulo", "Procedimientos y tasas");
            } else if (tipo.equals("F")) {
                mav.addObject("wtitulo", "Formatos y solicitudes");
            }
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            mav.addObject("lista", lista);
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("mensaje");
            String msg = "Debe iniciar sesión para poder acceder a la información";
            mav.addObject("msg", msg);
            return mav;
        }
    }

    @RequestMapping(params = "action=borrar")
    public ModelAndView borrarProcesos(HttpServletRequest request) {
        HttpSession sesion = request.getSession();
        if (sesion.getAttribute("cod_usu") != null) {
            String id = request.getParameter("id");
            ProcesoService service = new ProcesoService();
            String msg = "";
            int result = -1;
            try {
                result = service.delete(id);
                if (result > 0) {
                    msg = "Se elimino " + result + " registro(s) ";
                }
            } catch (Exception ex) {
                Logger.getLogger(ProcesoController.class.getName()).log(Level.SEVERE, null, ex);
            }
            ModelAndView mav = new ModelAndView("mensaje");
            if (msg == null || "".equals(msg)) {
                mav.addObject("msg", "No se pudo realizar la operación.");
            } else {
                mav.addObject("msg", msg);
            }
            mav.addObject("usuario_nombre", sesion.getAttribute("nombre"));
            return mav;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }

    }

    @RequestMapping(params = "action=descargar")
    public ModelAndView descargarProcesos(HttpServletRequest request,
            HttpServletResponse response) {
        HttpSession sesion = request.getSession();
        if (sesion.getAttribute("cod_usu") != null) {
            try {
                // Suponemos que es un zip lo que se quiere descargar el usuario.
                // Aqui se hace a piñón fijo, pero podría obtenerse el fichero
                // pedido por el usuario a partir de algún parámetro del request
                // o de la URL con la que nos han llamado.
                String nombreFichero = request.getParameter("nom_arch");
                String unPath = request.getSession().getServletContext().getRealPath("/") + "\\layout\\tmp\\";
                String ruta = unPath + nombreFichero;
                String extension = FilenameUtils.getExtension(ruta);
                if (isEquiv(extension, "txt")) {
                    response.setContentType("application/txt");
                } else if (isEquiv(extension, "zip")) {
                    response.setContentType("application/zip");
                } else if (isEquiv(extension, "pdf")) {
                    response.setContentType("application/pdf");
                } else if (isEquiv(extension, "jpg")) {
                    response.setContentType("application/jpg");
                } else if (isEquiv(extension, "png")) {
                    response.setContentType("application/png");
                } else if (isEquiv(extension, "xls")) {
                    response.setContentType("application/xls");
                } else if (isEquiv(extension, "xlsx")) {
                    response.setContentType("application/xlsx");
                }
                response.setHeader("Content-Disposition", "attachment; filename=\""
                        + nombreFichero + "\"");

                InputStream is = new FileInputStream(ruta);

                IOUtils.copy(is, response.getOutputStream());

                response.flushBuffer();

            } catch (IOException ex) {
                // Sacar log de error.
                System.out.println("error: " + ex.getMessage());
            }
            return null;
        } else {
            ModelAndView mav = new ModelAndView("index");
            return mav;
        }

    }

    private void grabarFicheroALocal(Proceso fileFormBean, String ruta) throws Exception {
        FileOutputStream fw = new FileOutputStream(ruta + "\\layout\\tmp\\" + fileFormBean.getNom_arch());
// Bucle de lectura del blob y escritura en el fichero, de 1024
// en 1024 bytes.
        byte bytes[] = new byte[1024];
        int leidos = fileFormBean.getArchivo().read(bytes);
        while (leidos > 0) {
            fw.write(bytes);
            leidos = fileFormBean.getArchivo().read(bytes);
        }
        fw.close();
        fileFormBean.getArchivo().close();
//        CommonsMultipartFile uploaded = fileFormBean.getFileData();
//        File localFile = new File(ruta + uploaded.getOriginalFilename());
//        FileOutputStream os = null;
//
//        try {
//
//            os = new FileOutputStream(localFile);
//            os.write(uploaded.getBytes());
//
//        } finally {
//            if (os != null) {
//                try {
//                    os.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
    }

    private void grabarFicheroALocalFor(Proceso fileFormBean, String ruta) throws Exception {
        FileOutputStream fw = new FileOutputStream(ruta + "\\layout\\tmp\\" + fileFormBean.getNom_archFor());
// Bucle de lectura del blob y escritura en el fichero, de 1024
// en 1024 byte
        byte bytes[] = new byte[1024];
        int leidos = fileFormBean.getArchivoFor().read(bytes);
        while (leidos > 0) {
            fw.write(bytes);
            leidos = fileFormBean.getArchivoFor().read(bytes);
        }
        fw.close();
        fileFormBean.getArchivoFor().close();
//        CommonsMultipartFile uploaded = fileFormBean.getFileData();
//        File localFile = new File(ruta + uploaded.getOriginalFilename());
//        FileOutputStream os = null;
//
//        try {
//
//            os = new FileOutputStream(localFile);
//            os.write(uploaded.getBytes());
//
//        } finally {
//            if (os != null) {
//                try {
//                    os.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
    }

}
